#include "GY_FloatArray.h"

GY_FloatArray::GY_FloatArray(const QString &guid, QGraphicsItem *parent)
    :GY_BasicsDataObjects(guid,this,parent)
{
    //图元类型
    GY_Object::setUserData(GY_ENUM::ClassType,QVariant("FloatArray"));
    initializationPropertyInfo();
    addAttribute(QString("Element[%1]").arg(0));
}

void GY_FloatArray::initializationPropertyInfo()
{
    GY_PropertyInfo ObjectName(this);
    ObjectName.propertyName = "ObjectName";
    ObjectName.propertyValue = QString();
    ObjectName.updateType = Update;
    ObjectName.propertyType = QStringPropertyType;
    ObjectName.updatePropertyFun = (GY_PropertyInfo::UpdatePropertyFun)&GY_FloatArray::updateObjectName;
    m_PropertyInfoMap.insert(ObjectName.propertyName,ObjectName);
    m_PropertyInfoMap[ObjectName.propertyName].setConnect();

    GY_PropertyInfo ElementCapacity(this);
    ElementCapacity.propertyName = "Element.Capacity";
    ElementCapacity.propertyValue = int(1);
    ElementCapacity.updateType = Update;
    ElementCapacity.propertyType = IntPropertyType;
    ElementCapacity.updatePropertyFun = (GY_PropertyInfo::UpdatePropertyFun)&GY_FloatArray::updateElementCapacity;
    m_PropertyInfoMap.insert(ElementCapacity.propertyName,ElementCapacity);
    m_PropertyInfoMap[ElementCapacity.propertyName].setConnect();

    GY_PropertyInfo ElementSize(this);
    ElementSize.propertyName = "Element.Size";
    ElementSize.propertyValue = int(1);
    ElementSize.updateType = Update;
    ElementSize.propertyType = IntPropertyType;
    ElementSize.updatePropertyFun = (GY_PropertyInfo::UpdatePropertyFun)&GY_FloatArray::updateElementSize;
    m_PropertyInfoMap.insert(ElementSize.propertyName,ElementSize);
    m_PropertyInfoMap[ElementSize.propertyName].setConnect();
}

bool GY_FloatArray::updateAttribute(const QString &name, const QVariant &value)
{
    if(!value.canConvert<float>()) {
        return false;
    }
    int ElementSize = m_PropertyInfoMap["Element.Size"].propertyValue.toInt();
    QRegExp rx("\\d+");
    rx.indexIn(name);
    //name中的数字是否超出显示范围
    int updateNum = rx.capturedTexts().at(0).toInt();
    if(updateNum >= ElementSize) {
        return false;
    }
    m_PropertyInfoMap[name].propertyValue = value;
    return true;
}

bool GY_FloatArray::updateElementCapacity(const QString &name, const QVariant &value)
{
    if(!value.canConvert<int>()) {
        return false;
    }
    m_PropertyInfoMap[name].propertyValue = value;
    int ElementSize = m_PropertyInfoMap["Element.Size"].propertyValue.toInt();
    if(value.toInt() < ElementSize) {
        //容量变小，Size不能超过容量
        m_PropertyInfoMap["Element.Size"].propertyValue = value;
    }
    updateAttributeMapNum();
    return true;
}

bool GY_FloatArray::updateElementSize(const QString &name, const QVariant &value)
{
    if(!value.canConvert<int>()) {
        return false;
    }
    m_PropertyInfoMap[name].propertyValue = value;
    int ElementCapacity = m_PropertyInfoMap["Element.Capacity"].propertyValue.toInt();
    if(value.toInt() > ElementCapacity) {
        //Size变大，容量必须超过Size
        m_PropertyInfoMap["Element.Capacity"].propertyValue = value;
    }
    updateAttributeMapNum();
    return true;
}

bool GY_FloatArray::addAttribute(const QString &name)
{
    if(m_PropertyInfoMap.contains(name)) {
        return false;
    }
    GY_PropertyInfo Attribute(this);
    Attribute.propertyName = name;
    Attribute.propertyValue = float(0);
    Attribute.updateType = Update;
    Attribute.propertyType = FloatPropertyType;
    Attribute.updatePropertyFun = (GY_PropertyInfo::UpdatePropertyFun)&GY_FloatArray::updateAttribute;
    m_PropertyInfoMap.insert(name,Attribute);
    m_PropertyInfoMap[Attribute.propertyName].setConnect();
    return true;
}

bool GY_FloatArray::deleteAttribute(const QString &name)
{
    if(!m_PropertyInfoMap.contains(name)) {
        return false;
    }
    m_PropertyInfoMap[name].propertyValue = 0;
    m_PropertyInfoMap.remove(name);
    return true;
}

void GY_FloatArray::updateAttributeMapNum()
{
    //存放容量
    int ElementCapacity = m_PropertyInfoMap["Element.Capacity"].propertyValue.toInt();
    int m_PropertyInfoMapSize = m_PropertyInfoMap.size();
    if(ElementCapacity > (m_PropertyInfoMapSize-3)) {
        for(int i=(m_PropertyInfoMapSize-3);i<ElementCapacity;i++) {
            addAttribute(QString("Element[%1]").arg(i));
        }
    }else if(ElementCapacity < (m_PropertyInfoMapSize-3)) {
        for(int i=(m_PropertyInfoMapSize-4);i>=ElementCapacity;i--) {
            deleteAttribute(QString("Element[%1]").arg(i));
        }
    }
}
